package Thread;
/**死锁的情况3：n个线程m把锁及第一种解决方式：按照相同的顺序获取锁*/
public class demo20_1 {
    public static void main(String[] args) {
        int n = 5; // 线程数量
        int m = 5; // 锁的数量
        // 创建锁对象
        Object[] locks = new Object[m];
        for (int i = 0; i < m; i++) {
            locks[i] = new Object();
        }
        // 创建线程
        for (int i = 0; i < n; i++) {
            final int threadIndex = i;
            Thread t = new Thread(() -> {
                // 每个线程尝试获取m把锁
                for (int j = 0; j < m; j++) {
                    // 当前线程要获取的 锁 的索引
                    // int lockIndex = (threadIndex + j) % m; // 问题的产生：每个线程以不同的顺序获取锁
                    int lockIndex = j; // 解决方式：每个线程以相同的顺序获取锁
                    // 获取到锁
                    synchronized (locks[lockIndex]) {
                        System.out.println("线程" + threadIndex + " 获取锁 " + lockIndex);
                        try {
                            Thread.sleep(1000); // 模拟耗时操作
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                }
            });
            t.start();
        }
    }
}
